package org.framework.common.api.service.bo;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.framework.common.api.entity.CommonEntityAware;
import org.framework.common.api.support.model.ChosenModel;
import org.framework.common.api.support.model.FormModel;
import org.framework.common.api.support.model.PageModel;
import org.framework.common.api.support.model.QueryModel;
import org.framework.common.api.support.model.TreeModel;


/**
 * <p>描述:公共业务接口，所有服务类均应实现此接口.</p>
 * <p>Company:上海中信信息发展股份有限公司</p>
 * @author chanlong(陈龙)
 * @date 2013年12月10日  下午4:35:17
 * @version 1.0.2013.
 */
public interface CommonBoAware<ENTITY extends CommonEntityAware<ID>, ID extends Serializable> {
	
	/**
	 * 更新.
	 * @param entity 要更新的实体对象
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2013年12月10日  下午4:39:15
	 */
	public ENTITY update(final ENTITY entity) throws Exception;
	
	/**
	 * 更新.
	 * PS: 根据指定字段查找并更新实体对象
	 * @param entity
	 * @param field
	 * @param value
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月9日 下午6:28:23
	 */
	public void update(final ENTITY entity, final String field, final Object value) throws Exception;
	
	/**
	 * 批量更新.
	 * @param entitys 要更新的实体对象集合
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2013年12月23日  上午10:55:54
	 */
	public void updateAll(final List<ENTITY> entities) throws Exception;
	
	/**
	 * 删除.
	 * @param entity
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2014年3月3日  上午10:29:01
	 */
	public void delete(final ENTITY entity) throws Exception;
	
	/**
	 * 删除.
	 * @param id 实体对象主键
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2013年12月23日  上午10:58:31
	 */
	public void delete(final Class<ENTITY> cls, final ID id) throws Exception;
	
	/**
	 * 批量删除.
	 * @param ids
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2013年12月23日  上午10:59:09
	 */
	@SuppressWarnings("unchecked")
	public void deleteAll(final Class<ENTITY> cls, final ID... ids) throws Exception;
	
	/**
	 * 新增.
	 * @param entity 要新增的实体对象
	 * @return 返回新增的实体对象（通常用于得到新增实体的主键ID）
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2013年12月10日  下午4:38:52
	 */
	public ENTITY insert(final ENTITY entity) throws Exception;
	
	/**
	 * 批量新增.
	 * @param entities
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2013年12月23日  上午11:01:55
	 */
	public List<ENTITY> insertAll(final List<ENTITY> entities) throws Exception;
	
	/**
	 * 新增关联(一对多).
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年2月3日 下午12:35:54
	 */
	public ENTITY insertRelation(final ENTITY entity) throws Exception;
	
	/**
	 * 新增关联（多对多）.
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年2月3日 下午12:14:34
	 */
	public ENTITY insertRelations(final ENTITY entity) throws Exception;

	/**
	 * 加载.
	 * @param entity 实体对象
	 * @return
	 * @throws Exception
	 * @author Administrator(陈龙)
	 * @date 2014-1-22  下午2:07:16
	 */
	public ENTITY loader(final ENTITY entity) throws Exception;
	
	/**
	 * 加载.
	 * @param cls 实体对象类
	 * @param id 实体对象主键
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2013年12月10日  下午4:48:57
	 */
	public ENTITY loader(final Class<ENTITY> cls, final ID id) throws Exception;
	
	/**
	 * 加载.
	 * @param cls
	 * @param params
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年8月30日 上午11:47:30
	 */
	public ENTITY loader(Class<ENTITY> cls, Map<String, Object> params) throws Exception;
	
	/**
	 * 加载.
	 * @param cls
	 * @param field
	 * @param value
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2014年4月25日  下午9:21:05
	 */
	public ENTITY loader(final Class<ENTITY> cls, final String field, final Object value) throws Exception;
	
	/**
	 * 查询.
	 * @param cls
	 * @param ids
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2014年3月3日  上午10:41:12
	 */
	@SuppressWarnings("unchecked")
	public List<ENTITY> findByIds(final Class<ENTITY> cls, final ID... ids) throws Exception;
	
	/**
	 * 查询结果总数.
	 * @param model
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月13日 下午3:17:21
	 */
	public long count(final QueryModel model) throws Exception;
	
	/**
	 * 查询.
	 * @param cls 实体对象类
	 * @param query QuerySupport对象
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2013年12月28日  下午12:45:11
	 */
	public PageModel<ENTITY> findByQuery(final QueryModel query) throws Exception;

	/**
	 * 下拉框.
	 * @param model
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年1月30日 上午10:13:44
	 */
	public ChosenModel[] select(final FormModel model) throws Exception;
	
	/**
	 * 树.
	 * @param model
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年3月30日 上午10:57:13
	 */
	public TreeModel[] tree(final QueryModel model) throws Exception;
	
	/**
	 * 获取最大编码.
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年1月23日 下午7:15:12
	 */
	public String maxcode() throws Exception;

	/**
	 * 添加查询参数.
	 * @param key
	 * @param value
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年4月9日 下午7:17:38
	 */
	public CommonBoAdapter<ENTITY, ID> addParameter(final String key, final Object value);
}
